## Sign Up Field Order

The Authenticator respects the order of the Sign Up fields that are provided in the `signUpFields(_:)` call.

If the Authenticator automatically adds a required missing attribute (e.g. the verification mechanism), it will appear at the end.

## Field Customization

When providing Sign Up Fields, you can use the default ones or define your own:

```swift
Authenticator { _ in
    Text("You are logged in!")
}.signUpFields([
    .username() // Default field for username
    .password(isRequred: false) // Makes password optional
    .text( // A customized text field for the Website attribute
        key = .website, // A AuthUserAttributeKey
        label = "Website", // Custom label
        placeholder = "Enter your website" // Custom placeholder
        isRequired: true, // Makes field mandatory
        validator: { content in // Custom validator
            guard content.contains("example.com") else {
                return "Your website must have a domain of example.com"
            }
            return nil
        }
    ),
    .custom( // A fully custom field for a Custom attribute
        attributeType: .custom(attributeKey: .custom("TOS")),
        validator: { content in
            guard let selected = Bool(content), selected else {
                return "You must agree to the Terms of Service"
            }
            return nil
        }
    ) { binding in
        Toggle(isOn: binding.asBool()) {
            Text("I agree to the terms of service")
        }
    }
])

// ...
// Custom extension to convert a Binding<String> into a Binding<Bool>
extension Binding where Value == String {
    func asBool() -> Binding<Bool> {
        return .init(
            get: {
                return Bool(wrappedValue) ?? false
            },
            set: { value in
                wrappedValue = String(value)
            }
        )
    }
}
```